// Package goroutine_pool: 自己实简单的协程池.
// @author: zhenxinma.
// @create: 2021-09-20 19:21:01
package goroutine_pool

// TODO: 先实现简单的功能,功能优化后续进行优化.

/**
协程池主要实现的功能是：
	1. 在大并发的时候控制协程数量防止协程数量急剧增加.
	2. 主要是控制协程的数量.
*/

/**
这个是必须要进行理解的.
上下文和协程之间的关系.
*/

/**

1. 初始化.
2. execute(func .)
	1. 判断当前工作数量.
	2. 判断现在正在运行的协程数和核心协程数的比较.
	3. 如果比核心线程数小，就addWorker.
		1. 通过addWorker进行增加，会向初始化过的队列中进行增加.
		2. 如果队列满了,接着向下执行.
	4.
*/

/**
实现最终结果:
1. 保证协程最大数量。
2. 协程超时返回一个特定的错误.
3. 错误重试.
4.
*/

// Poll 协程池的接口.
// 协程池应该具有初始化，启动，停止，运行.
// TODO: 先构思.
type Poll interface {
	// Init 池子初始化.
	Init() error
}

// GoroutinePoll 协程池接口的具体实现.
// 其需要有一个Chan来进行要执行的结构体的数据传输.
type GoroutinePoll struct {
	// 获取要执行的结构体,这里的interface只是暂时不确定.
	Task chan interface{}
}

// TODO: chan 看了经常忘记.
// goroutine 好久没有动工了啊.

// 如果要使用Chan来进行任务传输的话，会有一个问题就是，chan 内部使用互斥锁，同一个时刻只允许一个协程进行对Chan进行读写.

func (p *GoroutinePoll) Init() error {

	return nil
}
